from fastapi import APIRouter, UploadFile, File, Form, Depends, Query, Path
from typing import List, Optional, Any
from service.file_service import FileService
from middleware.auth import get_current_user
from utils.response import ResponseModel
from pydantic import BaseModel, Field

router = APIRouter(
    tags=["文件管理"],
    responses={404: {"description": "未找到"}}
)

class BatchResponse(BaseModel):
    """批次信息响应模型"""
    batch_id: str = Field(..., title="批次ID", description="文件上传批次的唯一标识")
    message: str = Field(..., title="响应消息", description="操作结果说明")

class ProcessItem(BaseModel):
    """文件处理记录模型"""
    file_name: str = Field(..., title="文件名", description="原始文件名")
    file_url: str = Field(..., title="处理后文件URL", description="文件处理后的访问地址")
    file_original_url: str = Field(..., title="原始文件URL", description="原始文件的访问地址")
    status: int = Field(..., title="处理状态", description="0: 待处理, 1: 处理中, 2: 处理完成, 3: 处理失败")
    type: int = Field(..., title="文件类型", description="1: 文本文件, 2: 图片, 3: 音频, 4: 视频")

class BatchProcessResponse(BaseModel):
    """批次处理记录响应模型"""
    batch_id: str = Field(..., title="批次ID", description="文件上传批次的唯一标识")
    processes: List[ProcessItem] = Field(..., title="处理记录列表", description="批次中的所有文件处理记录")

class BatchItem(BaseModel):
    """批次列表项模型"""
    batch_id: str = Field(..., title="批次ID", description="批次的唯一标识")
    final_file_url: Optional[str] = Field(None, title="最终文件URL", description="处理完成后的文件URL")
    sort_prompt: str = Field(..., title="排序提示词", description="文件处理的排序提示词")
    status: int = Field(..., title="批次状态", description="0: 待处理, 1: 处理中, 2: 处理完成, 3: 处理失败")
    created_at: str = Field(..., title="创建时间", description="批次创建的时间")

class BatchListResponse(BaseModel):
    """批次列表响应模型"""
    items: List[BatchItem] = Field(..., title="批次列表", description="当前页的批次列表")
    total: int = Field(..., title="总记录数", description="符合条件的总记录数")
    page: int = Field(..., title="当前页码", description="当前页的页码，从1开始")
    size: int = Field(..., title="每页大小", description="每页显示的记录数")
    pages: int = Field(..., title="总页数", description="总的页数")

class ApiResponse(BaseModel):
    """API通用响应模型"""
    code: int = Field(200, title="状态码", description="接口调用状态码，200表示成功")
    message: str = Field("success", title="响应消息", description="接口调用结果说明")
    data: Optional[Any] = Field(None, title="响应数据", description="接口返回的具体数据")

class BatchListApiResponse(ApiResponse):
    """批次列表API响应模型"""
    data: BatchListResponse

class BatchUploadApiResponse(ApiResponse):
    """文件上传API响应模型"""
    data: BatchResponse

class BatchProcessApiResponse(ApiResponse):
    """批次处理记录API响应模型"""
    data: BatchProcessResponse

class BatchStatusApiResponse(ApiResponse):
    """批次状态更新API响应模型"""
    data: dict
    message: str = Field("更新状态成功", title="响应消息", description="状态更新结果说明")

@router.post("/upload", summary="上传文件", description="""
上传一个或多个文件并进行处理。

- 对于文本类型文件(type=1)，包括：txt, md, doc, docx, pdf, csv, xls, xlsx, xlsm：
  - 会保存原始文件
  - 同时提取文本内容保存为txt文件
- 对于其他类型文件：直接保存，不做处理

返回的批次ID可用于后续查询处理状态。
""", response_model=BatchUploadApiResponse)
async def upload_files(
    files: List[UploadFile] = File(..., description="要上传的文件列表，支持多个文件同时上传"),
    sortPrompt: str = Form(..., description="排序提示词，用于指导文件的处理顺序"),
    current_user_id: int = Depends(get_current_user)
):
    db_result = await FileService.upload_files(files, sortPrompt, current_user_id)
    return BatchUploadApiResponse(
        data=BatchResponse(
            batch_id=db_result["batch_id"],
            message=db_result["message"]
        )
    )

@router.get("/batches", summary="获取批次列表", description="""
获取当前用户的所有文件处理批次。

返回的批次列表按创建时间倒序排列，支持分页查询。
""", response_model=BatchListApiResponse)
async def get_user_batches(
    page: int = Query(1, alias="page", title="页码", description="当前页码，从1开始"),
    size: int = Query(10, alias="size", title="每页大小", description="每页显示的记录数，范围1-100", ge=1, le=100),
    current_user_id: int = Depends(get_current_user)
):
    db_result = FileService.get_user_batches(
        user_id=current_user_id,
        page_num=page,
        page_size=size
    )
    # 将数据库对象转换为响应模型
    return BatchListApiResponse(
        data=BatchListResponse(
            items=[
                BatchItem(
                    batch_id=item.batch_id,
                    final_file_url=item.final_file_url,
                    sort_prompt=item.sort_prompt,
                    status=item.status,
                    created_at=str(item.created_at)
                ) for item in db_result["items"]
            ],
            total=db_result["total"],
            page=db_result["page"],
            size=db_result["size"],
            pages=db_result["pages"]
        )
    )

@router.get("/batch/{batch_id}/processes", summary="获取批次处理记录", description="""
获取指定批次的所有文件处理记录。

返回的处理记录按创建时间升序排列。
""", response_model=BatchProcessApiResponse)
async def get_batch_processes(
    batch_id: str = Path(..., title="批次ID", description="要查询的批次ID"),
    current_user_id: int = Depends(get_current_user)
):
    db_result = FileService.get_batch_processes(batch_id, current_user_id)
    # 将数据库对象转换为响应模型
    return BatchProcessApiResponse(
        data=BatchProcessResponse(
            batch_id=batch_id,
            processes=[
                ProcessItem(
                    file_name=process.file_name,
                    file_url=process.file_url,
                    file_original_url=process.file_original_url,
                    status=process.status,
                    type=process.type
                ) for process in db_result["processes"]
            ]
        )
    )

@router.put("/batch/{batch_id}/status", summary="更新批次状态", description="""
更新指定批次的状态。

只能更新状态为"待处理"(status=0)的批次。
""", response_model=BatchStatusApiResponse)
async def update_batch_status(
    batch_id: str = Path(..., title="批次ID", description="要更新状态的批次ID"),
    current_user_id: int = Depends(get_current_user)
):
    db_result = FileService.update_batch_status(batch_id, current_user_id)
    return BatchStatusApiResponse(
        data={
            "batch_id": db_result["batch_id"],
            "status": db_result["status"]
        }
    ) 